var sp = {
    spec_attr: {},//当前栏目的规格与属性
    edit_data: {},//编辑商品时，当前编辑商品的规格与属性
    stock_price_sn_data: {},//编辑商品时的库存、价格、货号数据
    //当更改商品列表库存时，更新goods表的库存字段即stock字段
    updateTotalStock: function () {
        $("[name*='stock'][sp]").live("blur", function () {
            var total_stock = 0;
            $("[name*='stock'][sp]").each(function (i) {
                var stock = parseInt($(this).val());
                if (stock)
                    total_stock += stock;
            })
            $("[name='stock']").val(total_stock);
        })
    },
    //更改商品价格
    updateGoodsPrice: function () {
        $("[name*='price'][sp]").live("blur", function () {
            var priceArr = [];
            $("[name*='price'][sp]").each(function (i) {
                var price = parseInt($(this).val());
                if (price)
                    priceArr.push(price);
            })
            $("[name='price']").val(priceArr.pop());
        })
    }
};
//当更改商品列表库存时，更新goods表的库存字段即stock字段
sp.updateTotalStock();
sp.updateGoodsPrice();

/**
 * 获得规格与属性
 * @param obj 栏目select表单对象
 * @param gid 商品gid  用于编辑时使用
 */
sp.getAttrSpec = function (obj, gid) {
    //验证栏目是否选择正确
    if (!sp.checkCategory(obj))return;
    $.post(CONTROL + "&m=getSpecAttr", {cid: $(obj).val(), gid: gid}, function (data) {
        sp.spec_attr = data;
        //创建属性表单
        sp.createAttrForm();
        //创建规格表单
        sp.createSpecForm();
        //如果是编辑商品时，设置属性与规格
        if (gid && data.edit_data.attr) {
            sp.setAttr();//设置属性
            sp.setSpec();//设置规格
        }
    }, "json")
}
/**
 * 编辑商品时设置属性
 */
sp.setAttr = function () {
    var attr = sp.spec_attr.edit_data.attr;
    $(attr).each(function (i) {
        var inputObj = $("[attr_value_av_id='" + attr[i]['attr_value_av_id'] + "']");//表单类型
        if (inputObj.attr("type") == 'text') {
            inputObj.attr("value", attr[i]['attr_value']);
        } else if (inputObj.attr("type") == "checkbox") {
            inputObj.attr("checked", true);
        }
    })
}
/**
 * 这是编辑商品时执行的函数
 * 编辑商品时，设置当前商品的属性与规格
 */
sp.setSpec = function () {
    //将当前商品的规格选中
    var spec = sp.spec_attr.edit_data.spec;
    var goods_list = {};
    for (var i in spec) {
        var sp_name = "sp_";//sp_14 库存等字段的sp属性
        for (var n in spec[i].attr) {
            sp_name += spec[i].attr[n].attr_value_av_id;
            var attr_value_av_id = spec[i].attr[n].attr_value_av_id;//当前商品已经选中的规格id
            $("input[av_id='" + attr_value_av_id + "']").attr("checked", "checked");
        }
        //本属性储存商品的库存、价格、货号等数据如sp.stock_price_sn_data["sp_14"]=[price:22,stock:12,goods_sn:123]
        sp.stock_price_sn_data[sp_name] = spec[i];
    }
    //创建库存、货号、价格表单
    sp.createStock();
}
/**
 * 验证栏目是否选择正确
 * @param obj 栏目对象
 * @returns {boolean} true选择正确  | false栏目选择错误，如选择了封面栏目或没有选择任何栏目
 */
sp.checkCategory = function (obj) {
    var option = $("option:selected", obj);
    //option为"==选择栏目=="option
    if (option.val() == 0)return false;
    //当为封面栏目时，弹出警告信息
    if (option.attr("class") == "feng") {
        alert("商品栏目不能为封面栏目");
        return false;
    }
    return true;
}
/**
 * 创建规格表单
 */
sp.createSpecForm = function () {
    //当前商品类型（也就是当前栏目所属商品类型）的所有属性
    var spec = sp.spec_attr.spec;
    //如果没有规格，不进行处理
    if (!spec)return;
    var html = "<h3>规格</h3>";
    for (var i = 0; i < spec.length; i++) {
        html += '<dl class="spec_list">';
        html += '<dt>' + spec[i]['attr_name'] + '</dt>';//规格名称如:颜色
        html += '<dd><ul>';
        var attr_value = spec[i]['g_attr_value'];
        $(attr_value).each(function (n) {
            var av_id = attr_value[n]['av_id'];//属性值av_id
            var attr_class_ac_id = attr_value[n]['attr_class_ac_id'];
            var value = attr_value[n]['attr_value'];//属性值
            html += '<li><label><input type="checkbox" lab="spec" attr_class_ac_id="' + attr_class_ac_id + '" av_id="' + av_id + '"/> ';
            html += '<span av_id="' + av_id + '">' + value + '</span>';
            html += '</label></li>'
        })
        html += '</ul></dd>';
        html += '</dl>';
    }
    $("div.spec").empty().append(html);
    //为规格input增加点击事件，当点击规格时产生规格、库存表单
    $("[lab='spec']").live("click", sp.createStock);
}

/**
 * 当点击规格checkbox时，执行的事件函数
 * 产生笛卡尔乘积，然后通过sp.createStockForm创建表单
 */
sp.createStock = function () {
    //有一个规格没有选中，就不进行操作
    if (!sp.checkSpecIsCheck()) {
        $("div.spec_field").remove();
        $("[name='stock']").removeAttr("readonly").css({background: '#fff', "color": "#333"});
        $("[name='price']").removeAttr("readonly").css({background: '#fff', "color": "#333"});
        $("[name='goods_sn']").removeAttr("disabled").parents("tr").eq(0).show();
        return;
    } else {//规格都选中后，更改goods表的html字段
        $("[name='stock']").attr("readonly", "readonly").css({background: "#EAEEF4", "color": "#999"});
        $("[name='price']").attr("readonly", "readonly").css({background: "#EAEEF4", "color": "#999"});
        $("[name='goods_sn']").attr("disabled", "disabled").parents("tr").eq(0).hide();
    }
    //获得选中的radio规格单选框，每个规格组合为一个数组，用于笛卡尔运算
    var spec_id = [];
    $("dl.spec_list input:checked").each(function (i) {
        //获得属性类型id
        var attr_class_ac_id = $(this).attr("attr_class_ac_id");
        if (!spec_id[attr_class_ac_id])spec_id[attr_class_ac_id] = [];
        spec_id[attr_class_ac_id].push($(this).attr("av_id"));
    })
    //根据选择的规格获得笛卡尔乘积，用于产生库存、价格、货号字段
    var descarteData = descarte(spec_id);
    var specData = {};
    for (var i = 0; i < descarteData.length; i++) {
        //获得库存表单name名
        var name = sp.getStockFieldName(descarteData[i]);
        specData[name] = descarteData[i];
    }
    //当某个规格取消选中时，移除规格表单,比如说，原来选择了红色，现在红色规格取消选择了，那么就要把红色规格的库存表单删除
    sp.removeStockForm(specData);
    //设置库存表单
    sp.createStockForm(specData);

}
/**
 * 获得库存表单name名
 * 如通过笛卡尔运行数组为[[1,2],[1,4]]
 * 规格表单的name名sp_12,sp_14
 */

sp.getStockFieldName = function (arr) {
    var name = "sp_";
    for (var i = 0; i < arr.length; i++) {
        name += arr[i];
    }
    return name;
}
/**
 * 本方法是通过sp.createStork()的调用的方法
 * 用于创建库存，货号表单
 *  @param descarte 通过sp.createStork()方法产生的产生笛卡尔乘积json数据
 */
sp.createStockForm = function (specData) {
    var html = "";
    //创建库存表格的表头信息
    if ($("div.spec_field").length == 0) {
        html += "<div class='spec_field'>";
        html += "<dl><dt>库存</dt><dd>";
        html += "<table class='table1 title'>";
        html += "<thead><tr>";
        $("dl.spec_list dt").each(function (i) {
            html += "<td>" + $(this).text() + "</td>";
        })
        html += "<td>价格</td><td>库存</td><td>商品货号</td>";
        html += "</tr></thead>";
        html += "<tbody></tbody></table>";
        html += "</dd></dl>";
        $("div.spec").append(html);
    }
    //====================根据笛卡尔积生成库存，货号表单====================
    for (var i  in specData) {
        //当库存，货号表单已经存在时，不再添加
        if ($("div.spec_field input[sp='" + i + "']").length)continue;
        var name = "spec[" + i + "]";//表单名
        var html = "<tr>";
        for (var n = 0; n < specData[i].length; n++) {
            var av_id = specData[i][n];
            var attr_value = $("dl.spec_list span[av_id='" + av_id + "']").text();
            html += "<td>";
            //规格id
            html += "<input type='hidden' name='goods_attr[av_id_" + av_id + "]' value='" + attr_value + "'/>";
            //规格值
            html += "<input type='hidden' name='" + name + "[av_id][" + av_id + "]' value='" + attr_value + "'/>";
            html += attr_value + "</td>";
        }
        var price_value = stock_value = goods_sn_value = "";//库存与商品货号变量
        if (sp.stock_price_sn_data[i]) {
            price_value = sp.stock_price_sn_data[i].price;
            stock_value = sp.stock_price_sn_data[i].stock;
            goods_sn_value = sp.stock_price_sn_data[i].goods_sn;
        }
        html += "<td><input type='text' sp='" + i + "' name='" + name + "[price]' class='w80' value='" + price_value + "'/></td>";//价格
        html += "<td><input type='text' sp='" + i + "' name='" + name + "[stock]' class='w80' value='" + stock_value + "'/></td>";//库存
        html += "<td><input type='text' sp='" + i + "' name='" + name + "[goods_sn]' class='w80' value='" + goods_sn_value + "'/></td>";//货号
        html += "</tr>";
        $(".spec_field table tbody").append(html);
    }
}
/**
 * 验证是否有规格没有选中
 * 如果有一个规格没有选择
 * 如有颜色，尺寸规格，颜色规格有选中，尺寸规格没有选择，就不产生价格、库存列表
 */
sp.checkSpecIsCheck = function () {
    var stat = true;
    //如果有一个dd中的radio没有选中时，不进行操作
    $("dl.spec_list").each(function (i) {
        if ($("input:checked", this).length == 0) {
            stat = false;
            return;
        }
    })
    return stat;
}
/**
 * 当某个规格取消选中时，移除规格表单
 * @param specData 规格数据如{sp_14:[1,2],sp_15:[1,5]}
 */
sp.removeStockForm = function (specData) {
    //获得当前已经存在的所有库存价格表单
    $("div.spec_field input[name*='price']").each(function (i) {
        var sp_name = $(this).attr("sp");
        if (!specData[sp_name]) {
            $(this).parents("tr").eq(0).remove();
        }
    })
}


/**
 * 创建属性表单
 * @param data 包含规格与属性的JSON数据
 */
sp.createAttrForm = function () {
    //当前商品类型（也就是当前栏目所属商品类型）的所有属性
    var attr = sp.spec_attr.attr;
    //如果没有属性不进行处理
    if (!attr)return;
    var html = "<h3>属性</h3>";
    for (var i = 0; i < attr.length; i++) {
        //单行属性input
        html += '<dl><dt>' + attr[i].attr_name + '</dt>';
        html += '<dd>';
        var attr_value = attr[i].g_attr_value;
        $(attr_value).each(function (n) {
            var attr_value_av_id = attr_value[n].av_id;//属性值av_id
            var name = "goods_attr[av_id_" + attr_value_av_id + "]";//表单name
            var value = attr_value[n]['attr_value'];//属性值
            var show_type = attr[i].show_type;//显示类型 0 文本框  1 复选框  2 单选框
            if (show_type == 0) {
                html += '<label><input type="text" name="' + name + '" value="' + value + '" attr_value_av_id="' + attr_value_av_id + '" /></label>';
            } else if (show_type == 1) {
                html += '<label><input type="checkbox" name="' + name + '" value="' + value + '" attr_value_av_id="' + attr_value_av_id + '" /> ' + value + ' </label>';
            }
        })
        html += '</dd></dl>';
    }
    $("div.attribute").empty().append(html);
}


















